package com.ysd.twocrm.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    public static void main(String[] args) {
       System.out.println( password("123"));
       System.out.println(kl(password("123")));
        System.out.println(jm(kl(password("123"))));
    }


    /*
     * @Description 生成md5 创建md5对象，然后通过传来的字符串从字符串变成字符在变成字节，然后将字节转成16进制
     * @param instr
     * @return java.lang.String
     * @author liusupeng
     * @date 2020/4/22 22:07
     */
    public static String password(String instr){

        MessageDigest md5=null;

        try {
            md5=MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        //将传来的字符串对象中的每一个字符转换为一个字符数组
        char[] charArray=instr.toCharArray();
        //定义一个长度和上面字符数组一样长度的字节数组
        byte[] byteArray=new byte[charArray.length];
         //遍历字符的数组，取到每一个字符并且赋值给字节
        for(int i=0;i<charArray.length;i++){
            byteArray[i]=(byte) charArray[i];
        }
        //把MD5这个对象对字节数组进行摘要，得到一个摘要字节的数组
        byte[] md5Bytes=md5.digest(byteArray);
        //把数组里的每一个字节转换成16进制，并且拼在一起就的得到md5的值
        //0xFF 是计算机十六进制的表示
        StringBuffer stringBuffer=new StringBuffer();
        for(int i=0;i<md5Bytes.length;i++){
           int val= ((int) md5Bytes[i]) & 0xff;

           if(val<16){
               stringBuffer.append(0);//如果生成的数组未满32位，需要再前面补0
           }
            stringBuffer.append(Integer.toHexString(val));
        }
        return stringBuffer.toString();
    }



/* 加盐加密 为了防止md5能被破解，所以使用加盐加密的方式
 * @Description
 * @param instr
 * @return java.lang.String
 * @author liusupeng
 * @date 2020/4/22 22:07
 */
    public static String kl(String instr){

         //把加密的字符串转换成字符
        char[] charArray=instr.toCharArray();
        for(int i=0;i<charArray.length;i++){
            //亦或运算符 如果chararray[i] 和‘t’两个值不相同，亦或结果就为1 相同则为0
            charArray[i]=(char)(charArray[i] ^ 't');
        }
        String s=new String(charArray);
        return s;
    }

/* 反编译加盐加密来读取原本的md5
 * @Description
 * @param instr
 * @return java.lang.String
 * @author liusupeng
 * @date 2020/4/22 22:07
 */
    public static String jm(String instr){

        //把加密的字符串转换成字符
        char[] charArray=instr.toCharArray();
        for(int i=0;i<charArray.length;i++){
            //亦或运算符 如果chararray[i] 和‘t’两个值不相同，亦或结果就为1 相同则为0
            charArray[i]=(char)(charArray[i] ^ 't');
        }
        String s=new String(charArray);
        return s;
    }




}
